package com.cbg.archives.repository;

import com.cbg.archives.dto.ArchivesModularDTO;
import com.cbg.archives.entity.EsArchivesModular;
import com.cbg.dto.DirectionsDTO;
import com.shuyuwl.core.repository.DaoRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 个人档案模块 repository
 *
 * @author wangjuzheng
 * @since 2019-10-16
 */
@Repository
public interface IEsArchivesModularRepository extends DaoRepository<EsArchivesModular, Long> {

    /**
     * 获取最大的排序号
     *
     * @param archivesId 档案分类id
     * @param status     状态
     * @return 排序号
     */
    @Query("select max(sort) from EsArchivesModular where archivesId=?1 and status =?2")
    Integer getMaxSort(Long archivesId, Byte status);

    /**
     * 获取启用的模块信息
     *
     * @param id     模块id
     * @param status 状态
     * @return 模块
     */
    EsArchivesModular findByIdAndStatus(Long id, Byte status);

    /**
     * 获取模块列表信息并且排序
     *
     * @param archivesId  档案分类id
     * @param status      状态
     * @param tableStatus 状态
     * @return 分类下的模块信息
     */
    @Query("select new com.cbg.archives.dto.ArchivesModularDTO(m.id,m.archivesId,t.id,m.displayStyle,m.isSecondarySearch,m.isDisplayColumn,m.isPage,m.pageNumber,m.name)" +
            "from EsArchivesModular m left join EsTable t on m.tableId = t.id" +
            " where m.archivesId=?1 and m.status = ?2 and t.status = ?3 order by m.sort asc")
    List<ArchivesModularDTO> selectedArchives(Long archivesId, Byte status, Byte tableStatus);

    /**
     * 查询分类下的是否存在同名的模块信息
     *
     * @param categoryPid    分类id
     * @param modularColName 模块id
     * @param status         状态
     * @return 模块信息
     */
    List<EsArchivesModular>  findByArchivesIdAndAndNameAndStatus(Long categoryPid, String modularColName, Byte status);

    /**
     * 删除分类下的模块和模块对应的列信息
     *
     * @param archivesId 分类id
     * @param status     状态
     */
    @Modifying
    @Query(value = "UPDATE es_archives_modular e LEFT JOIN es_archives_modular_col c ON c.modular_id = e.id  SET e.status = ?2, c.status = ?2 " +
            " WHERE e.archives_id = ?1 AND e.status< ?2 AND c.status < ?2", nativeQuery = true)
    void deleteByArchivesId(Long archivesId, Byte status);


    /**
     * 获取模块列表信息并且排序
     *
     * @param archivesId  档案分类id
     * @param status      状态
     * @param tableStatus 状态
     * @return 分类下的模块信息
     */
    @Query("select new com.cbg.dto.DirectionsDTO(m.id,m.sort,t.status)" +
            "from EsArchivesModular m left join EsTable t on m.tableId = t.id" +
            " where m.archivesId=?1 and m.status = ?2 and t.status < ?3 order by m.sort asc")
    List<DirectionsDTO> getDirectionsDTOs(Long archivesId, Byte status, Byte tableStatus);

    /**
     * 批量修改排序
     *
     * @param modularIds 模块id
     * @param addSortNum 需要添加的排序数
     * @param status     状态
     */
    @Modifying
    @Query(value = "UPDATE EsArchivesModular SET sort= sort+?2 WHERE id in ?1 and status=?3")
    void updateSort(List<Long> modularIds, int addSortNum, Byte status);
}
